package cn.iocoder.yudao.module.ai.graph.node.customerservice;

import com.alibaba.cloud.ai.graph.OverAllState;
import com.alibaba.cloud.ai.graph.action.NodeAction;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.HashMap;
import java.util.Map;

/**
 * 人工审核节点 - 这是工作流的打断点
 * 
 * 人工可以在这里：
 * 1. 查看 AI 生成的回复
 * 2. 决定是否批准、修改或采取其他行动
 * 3. 修改回复内容
 * 4. 选择下一步处理方式：
 *    - 发送回复（send_reply）
 *    - 转人工客服（transfer_to_human）
 *    - 升级到高级支持（escalate）
 *    - 结束流程（END）
 * 
 * @author yudao
 * @since 2025/10/17
 */
public class HumanReviewNode implements NodeAction {

    private static final Logger logger = LoggerFactory.getLogger(HumanReviewNode.class);

    @Override
    public Map<String, Object> apply(OverAllState state) {
        logger.info("=== HumanReviewNode - 等待人工审核 ===");
        
        // 获取 AI 生成的回复和相关信息
        String aiReply = state.value("ai_reply", "");
        Double confidence = state.value("ai_confidence", 0.0);
        String category = state.value("query_category", "");
        String priority = state.value("query_priority", "");
        String sentiment = state.value("query_sentiment", "");
        
        logger.info("AI 回复：{}", aiReply);
        logger.info("置信度：{}", confidence);
        logger.info("分类信息 - 类别：{}，优先级：{}，情绪：{}", category, priority, sentiment);
        
        // 从人工反馈中获取决策
        Map<String, Object> feedBackData = state.humanFeedback().data();
        
        // 人工审核结果
        boolean approved = (boolean) feedBackData.getOrDefault("approved", false);
        String modifiedReply = (String) feedBackData.getOrDefault("modified_reply", aiReply);
        String decision = (String) feedBackData.getOrDefault("decision", "send_reply");
        String comments = (String) feedBackData.getOrDefault("comments", "");
        
        logger.info("人工审核结果 - 批准：{}，决策：{}", approved, decision);
        if (!comments.isEmpty()) {
            logger.info("人工备注：{}", comments);
        }
        
        // 准备结果
        Map<String, Object> resultMap = new HashMap<>();
        resultMap.put("human_approved", approved);
        resultMap.put("human_modified_reply", modifiedReply);
        resultMap.put("human_decision", decision);
        resultMap.put("human_comments", comments);
        resultMap.put("next_node", decision);
        
        // 如果人工修改了回复，使用修改后的版本
        if (!modifiedReply.equals(aiReply)) {
            resultMap.put("final_reply", modifiedReply);
            logger.info("使用人工修改后的回复");
        } else {
            resultMap.put("final_reply", aiReply);
            logger.info("使用 AI 原始回复");
        }
        
        logger.info("下一步流程：{}", decision);
        
        return resultMap;
    }
}

